package jwt

import (
	"errors"
	"time"

	"github.com/dgrijalva/jwt-go"
)

const TokenExpireDuration = 24 * time.Hour

// 密钥
var SecretKey = []byte("123456")

// 用户账号信息
type UserAccountInfo struct {
	Uid      int64
	Username string
}

// 定义token的声明 JWT中的payload中不要放重要数据,因为这部分数据通过Base64URL算法能反解出来
type Claims struct {
	//自定义私有数据
	UserAccount UserAccountInfo
	//jwt的标准claim
	jwt.StandardClaims
}

// 生成token
func CreateToken(uid int64, username string) (string, error) {
	c := Claims{
		UserAccount: UserAccountInfo{
			Uid:      uid,
			Username: username,
		},
		StandardClaims: jwt.StandardClaims{
			// token过期时间
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(),
			// 签发人
			Issuer:  "biubiu",
			Subject: "jwt",
		},
	}

	// 生成token,默认采用HMAC SHA256
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)

	// 加上签名(需要用到秘钥),生成完整的token
	return token.SignedString(SecretKey)
}

// 解析token
func ParseToken(tokenStr string) (*Claims, error) {
	token, err := jwt.ParseWithClaims(tokenStr, &Claims{}, func(token *jwt.Token) (i interface{}, err error) {
		return SecretKey, nil
	})
	if err != nil {
		return nil, err
	}
	if claims, ok := token.Claims.(*Claims); ok && token.Valid {
		return claims, nil
	}
	return nil, errors.New("invalid token")
}
